package main

import (
	"fmt"
	"sync"
)

func main() {
	demo1()
	demo2()
}

// 使用锁解决并发安全
func demo2() {
	var count = 0
	var wg sync.WaitGroup
	var mu sync.Mutex // 声明互斥锁
	wg.Add(10)

	// 10个goroutine各加1万次
	for i := 0; i < 10; i++ {
		go func() {
			defer wg.Done()
			for j := 0; j < 10000; j++ {
				// 加锁保护临界区
				mu.Lock()
				count++
				mu.Unlock()
			}
		}()
	}

	wg.Wait()
	fmt.Println("加锁实现一个计数器的结果：", count) //稳定输出 100000
}

// 一个不加锁的例子，实现一个计数器
func demo1() {
	var count = 0
	var wg sync.WaitGroup
	wg.Add(10)

	// 10个goroutine各加1万次
	for i := 0; i < 10; i++ {
		go func() {
			defer wg.Done()
			for j := 0; j < 10000; j++ {
				count++ // 非原子操作，存在并发安全问题
			}
		}()
	}

	wg.Wait()
	fmt.Println("不加锁实现一个计数器的结果：", count) // 大概率小于100000
}
